iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0

昨天,我們已建立完決策樹,那今天,我打算帶入資料去看他分類結果:
建立決策樹的使用模型:

#用樹來預測樣本
def tree_Classify(decisionTree, featureLabel, testDataSet):
    firstFeature = list(decisionTree.keys())[0]
    secondFeatDict = decisionTree[firstFeature]
    splitValue = float(list(secondFeatDict.keys())[0][1:])
    #因為test資料少目標值,所以在計算索引時要少1
    featureIndex = featureLabel[firstFeature-1]
    
    if float(testDataSet[featureIndex] )<= splitValue:
        valueOfFeat = secondFeatDict['<' + str(splitValue)]
    else:
        valueOfFeat = secondFeatDict['>' + str(splitValue)]
    #如果還有字典,就繼續往下
    if isinstance(valueOfFeat, dict):
        pred_label = tree_Classify(valueOfFeat, featureLabel, testDataSet)
    else:
        pred_label = valueOfFeat
    return pred_label
test_Data = [1.09,3.852,2,3.5]
pre_label = tree_Classify(myTree1, data.columns[1:], test_Data)
print(pre_label)

這樣子就會得到結果:輸出2
當然如果只有一棵樹就當成預測結果,會顯得太獨斷一點,所以利用之前說明的袋裝法,來生成多個的train集就可以建立多個樹,有了多個樹就會有多個預測類別最後因為是類別型資料,所以取個數最多的就是最終預測
首先改寫一下bagging_k

import random as rd
import pandas as pd
import copy
#一個5維資料,共5筆,data(第0維為y)
data=pd.DataFrame([[1,1.01,0.852,5,1.5],[2,2.01,0.31,8,8.1],[1,3.01,0.589,9,5.6],[1,3.01,0.01,8,2.3],[2,4.01,0.258,10,1.1]])
#預設m=4:表示重複抽資料4次;k=5:表示5組資料;d=3:隨機選三個特徵
def bagging_k(data,m=4,k=5,d=3):
    n=len(data)
    #建立放全部資料的data_k
    data_k=[]
    for j in range(k):
        data_use1=[]
        #選取除目標以外d個特徵
        features = rd.sample(range(1,n), d)
        #把目標加回去
        features.insert(0,0) 
        features.sort()
        print("第",j+1,"組特徵:",features)
        data_use1=copy.deepcopy(data[features])
        print(data_use1)
        rows=[]
        #重複抽樣過程
        for i in range(m):
            rows.append(rd.randint(0, len(data_use1)-1))

        data_m=data_use1.iloc[rows]
        print("第",j+1,"組數據:",data_m)
		 #重排索引
data_m=data_m.reset_index(drop=True)
        data_k.append(data_m)
    return data_k
print("全部數據:",bagging_k(data))

結果如下:

全部數據: [   
0     1   3    4
0  2  4.01  10  1.1
1  2  2.01   8  8.1
2  1  1.01   5  1.5
3  2  4.01  10  1.1,  
  0     1      2    4
0  1  3.01  0.010  2.3
1  1  1.01  0.852  1.5
2  1  1.01  0.852  1.5
3  1  1.01  0.852  1.5,  
  0     1      2  3
0  1  3.01  0.010  8
1  1  3.01  0.010  8
2  1  3.01  0.589  9
3  1  3.01  0.589  9,   
 0     1      2    4
0  2  2.01  0.310  8.1
1  2  2.01  0.310  8.1
2  1  3.01  0.010  2.3
3  1  3.01  0.589  5.6,   
 0      2  3    4
0  1  0.010  8  2.3
1  2  0.310  8  8.1
2  1  0.589  9  5.6
3  2  0.310  8  8.1] 

這樣就有多組數據,再來做關於決策樹建立,

trees=[]
for i in bagging_k(data):
    trees.append(create_Tree(i))
for j in trees:
    print(j)

建立完後就會有很多棵樹,如下:

{4: {'<3.55': {1: {'<2.51': 1.0, '>2.51': 2.0}}, '>3.55': 1.0}}
{1: {'<2.51': 2.0, '>2.51': 1.0}}
{3: {'<9.0': {1: {'<2.51': 2.0, '>2.51': 1.0}}, '>9.0': 2.0}}
{2: {'<0.4495': 2.0, '>0.4495': 1.0}}
{1: {'<1.51': 1.0, '>1.51': {2: {'<0.134': 1.0, '>0.134': 2.0}}}}

再來就是針對test集依照這幾棵樹來預測類別

trees=[]
data_k=bagging_k(data)
for i in data_k:
    trees.append(create_Tree(i))
for j in range(len(trees)):
    test_Data = pd.DataFrame([[1.09,3.852,2,3.5]],columns=[1,2,3,4])
    if isinstance(trees[j], dict):
        pre_label = tree_Classify(trees[j], data_k[j].columns[1:], test_Data)
    else:
        pre_label = trees[j]
    print("預測類別:",pre_label)

所以預測完後,選最多類別

預測類別: 2.0
預測類別: 1.0
預測類別: 1.0
預測類別: 2.0
預測類別: 1.0

-->所以就是第1類比例最多-->所以預測就是1
好,今天實作部分完成了,明天就說明下回歸方法下隨機森林差異

在男孩敲了門之後,屋內的歌聲突然消失了,在一陣寂靜之後,門緩緩打開,但卻沒有任何人出現,男孩疑惑地往屋內看,裡面黑漆漆一片,甚麼也看不到,男孩順著牆壁找到了電燈開關,他按了下去,瞬間,屋內充滿光亮,但男孩發現裡面甚麼都沒有,只有剛剛的窗簾和正中央有一張桌子,桌子上只有一個木頭做成的人偶,人偶上有一雙大大的眼睛,正望著窗簾,男孩走近一看,發現這個人偶只有眼睛,但卻沒有嘴巴
				--|為了你,我失去了一切 |--     MS.CM

上一篇
DAY07隨機森林演算法(續5)
下一篇
DAY09隨機森林演算法(回歸方法)
系列文
數據分析方法研究和理解演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言